package com.cloudfun.campusshare.service;

import com.cloudfun.campusshare.common.constant.DeviceModuleStatus;
import com.cloudfun.campusshare.common.exception.BusinessException;
import com.cloudfun.campusshare.common.model.dto.DeviceQueryDTO;
import com.cloudfun.campusshare.common.model.vo.*;
import com.cloudfun.campusshare.common.response.BaseResult;
import com.cloudfun.campusshare.common.response.PageResult;
import com.cloudfun.campusshare.entity.DeviceEntity;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Set;


/**
 * @author linyangping
 * @date 2019/11/5
 */
public interface DeviceService {

    /**
     * 绑定设备
     *
     * @param deviceVo
     */
    BaseResult merchantBind(DeviceVO deviceVo);

    /**
     * 绑定设备
     *
     * @param deviceVo
     * @return
     */
    BaseResult<?> bind(DeviceVO deviceVo);

    /**
     * 解绑设备
     *
     * @param imei
     */
    BaseResult unbind(String imei);

    /**
     * 解绑设备
     *
     * @param imeiSet
     * @param userId
     * @return
     */
    BaseResult<?> unbindAll(Set<String> imeiSet, String userId);

    /**
     * 解绑
     *
     * @param userId
     * @return
     */
    BaseResult<?> unbindAll(String userId);

    /**
     * 解绑
     *
     * @param value
     * @param userId
     * @return
     */
    BaseResult<?> unbindAllByKeyword(String value, String userId);

    /**
     * 设备列表
     *
     * @param pageable
     * @param deviceQueryDTO
     * @return
     * @throws BusinessException
     */
    BaseResult<PageResult<DeviceListVO>> queryDeviceList(Pageable pageable, DeviceQueryDTO deviceQueryDTO);

    /**
     * 金融机构查询商家设备列表
     *
     * @param pageable
     * @param borrowerId
     * @return
     */
    PageResult<DeviceListVO> queryBorrowerDeviceList(Pageable pageable, String borrowerId);

    /**
     * 根据Imei获取设备
     *
     * @param imei
     * @return
     */
    DeviceEntity getDeviceWithAuthByImei(String imei);

    /**
     * 根据Imei获取设备
     *
     * @param imei
     * @return
     */
    DeviceEntity getDeviceWithoutAuthByImei(String imei);

    /**
     * 根据machineNo获取设备
     *
     * @param machineNo
     * @return
     */
    DeviceEntity getDeviceWithoutAuthByMachineNo(String machineNo);

    /**
     * 根据用户分组搜索统计
     *
     * @return
     */
    BaseResult<PageResult<DeviceStatisticsVo>> groupCountByUser(Pageable pageable, String value);

    /**
     * 统计
     *
     * @return
     */
    BaseResult<?> countAll(String userId);

    /**
     * 设备详情
     *
     * @param id
     * @return
     */
    DeviceDetailVO detail(String id);

    /**
     * 导出
     *
     * @param imeiSet
     * @param userId
     * @return
     */
    List<DeviceExportVO> export(Set<String> imeiSet, String userId);

    /**
     * 导出
     *
     * @param value
     * @param userId
     * @return
     */
    List<DeviceExportVO> exportByKeyword(String value, String userId);

    /**
     * 导出
     *
     * @param userId
     * @return
     */
    List<DeviceExportVO> export(String userId);

    /**
     * 金融机构导出商家设备
     *
     * @param borrowerId
     * @param projectId
     * @return
     */
    List<BorrowerDeviceExportVO> fiExportBorrowerDevice(String borrowerId, String projectId);


    /**
     * 管理员导出商家设备
     *
     * @param borrowerId
     * @param projectId
     * @return
     */
    List<BorrowerDeviceExportVO> adminExportBorrowerDevice(String borrowerId, String projectId);

    /**
     * 统计和平台有交互的设备数量
     *
     * @param userId
     * @return
     */
    Long countInteractedDevices(String userId);

    /**
     * 统计和平台有交互的设备数量
     *
     * @return
     */
    Long countInteractedDevices();

    /**
     * 统计今天和平台有交互的设备数量
     *
     * @param userId
     * @return
     */
    Long countTodayInteractedDevices(String userId);

    /**
     * 金融机构查询商家和平台有交互的设备数量
     *
     * @param borrowerId
     * @return
     */
    Long countBorrowerInteractedDevices(String borrowerId);

    /**
     * 金融机构查询今天和平台有交互的设备数量
     *
     * @param borrowerId
     * @return
     */
    Long countBorrowerTodayInteractedDevices(String borrowerId);

    /**
     * 非金融机构查询项目和平台有交互的设备数量
     *
     * @param projectId
     * @return
     */
    Long countProjectInteractedDevices(String projectId);

    /**
     * 非金融机构查询项目今天和平台有交互的设备数量
     *
     * @param projectId
     * @return
     */
    Long countProjectTodayInteractedDevices(String projectId);

    /**
     * 金融机构查询商家设备详情
     *
     * @param id
     * @return
     */
    BorrowerDeviceDetailVO borrowerDeviceDetail(String id);

    /**
     * 从项目上解绑
     *
     * @param projectId
     */
    void unbindProject(String projectId);

    /**
     * 获取设备类型
     *
     * @param imei
     * @return
     */
    String getDeviceType(String imei);

    /**
     * 设备是否已锁定
     *
     * @param deviceId
     * @return
     */
    boolean deviceLocked(String deviceId);

    /**
     * 支付锁定设备
     *
     * @param deviceId
     * @return
     */
    boolean lockDevice(String deviceId);

    /**
     * 锁定设备并指定时间
     *
     * @param imei
     * @param time
     * @return
     */
    boolean lockDevice(String imei, int time);

    /**
     * 移交设备锁
     *
     * @param imei
     * @param time
     */
    void lockTransfer(String imei, String userId, int time);


    /**
     * 解锁设备
     *
     * @param deviceId
     * @return
     */
    boolean unlockDevice(String deviceId);

    /**
     * 获取设备信息
     *
     * @param machineNo
     * @return
     */
    DeviceInfoVO getDeviceInfo(String machineNo);

    /**
     * 对于顾客，设备是否可用
     *
     * @param deviceEntity
     * @return
     */
    boolean deviceAvailable4Customer(DeviceEntity deviceEntity);

    /**
     * 设备是否在服务时间
     *
     * @param serviceTimeId
     * @return
     */
    boolean inServiceTime(String serviceTimeId);

    /**
     * 用户可用设备查询条件
     *
     * @param washPointId
     * @return
     */
    Specification<DeviceEntity> customerAvailableDeviceSpec(String washPointId);

    /**
     * 根据洗衣点查询设备列表
     *
     * @param pageable
     * @param washPointId
     * @return
     */
    PageResult<DeviceListVO> queryDeviceListByWashPoint(Pageable pageable, String washPointId);


    /**
     * 运营平台查询设备列表
     *
     * @param washPointIds
     * @param keyword
     * @param deviceType
     * @param deviceStatus
     * @return
     */
    PageResult queryDeviceListForOperPlat(Pageable pageable, Set<String> washPointIds, String keyword, String deviceType, String productType,
                                          Integer deviceStatus, String userId);

    PageResult queryDeviceListForOperPlat(Pageable pageable, Set<String> washPointIds, String keyword, String deviceType, String productType,
                                          Integer deviceStatus, String userId,String province,String city);

    /**
     * 运营平台导出设备列表
     *
     * @param imeiSet
     * @param keyword
     * @param deviceType
     * @param deviceStatus
     * @param all
     * @param userId
     * @return
     */
    List<DeviceExportForOperVO> exportDeviceForOperPlat(Set<String> ids, String keyword, String deviceType, Integer deviceStatus,
                                                        Boolean all, String userId);

    /**
     * 启用/停用设备
     *
     * @param id
     * @param isUsing
     */
    void startOrEndingDevice(String id, Boolean isUsing);

    /**
     * 批量启用/停用设备
     *
     * @param isUsing
     */
    void batchStartOrEndingDevice(BatchSwitchDeviceVO batchSwitchDeviceVO);


    /**
     * 运营平台查询设备详情
     *
     * @param id
     * @return
     */
    DeviceDetailForOperVO operQueryDeviceDetail(String id);


    /**
     * 运营平台查询历史记录
     *
     * @param deviceId
     * @return
     */
    PageResult operQueryInvokeHistory(Pageable pageable, String deviceId);

    /**
     * 运营平台编辑设备
     *
     * @param editDeviceForOperVO
     */
    void operEditDevice(EditDeviceForOperVO editDeviceForOperVO);

    /**
     * 更新设备模式集
     *
     * @param oldId
     * @param newId
     */
    void updateDeviceModeSetId(String oldId, String newId);

    /**
     * 运营商设备状态统计
     *
     * @param productType
     * @param deviceType
     * @param preferWashPointId
     * @return
     */
    OMDeviceStateStatisticsVO omDeviceStateStatistics(String productType, String deviceType, String preferWashPointId);

    /**
     * +
     * 批量更改设备洗衣点
     *
     * @param ids
     * @param washPointId
     */
    void batchChangeWashPoint(Set<String> ids, String washPointId);

    /**
     * 批量更改设备收费模式
     *
     * @param ids
     * @param deviceModeId
     */
    void batchChangeDeviceMode(Set<String> ids, String deviceModeId);

    /**
     * 设备上线
     *
     * @param imei
     */
    void deviceOnline(String imei);

    /**
     * 设备下线
     *
     * @param imei
     */
    void deviceOffline(String imei);

    /**
     * 更新iccid
     *
     * @param imei
     * @param iccid
     */
    void updateDeviceIccid(String imei, String iccid);

    /**
     * 批量更改设备收费模式
     *
     * @param ids
     * @param serviceTimeId
     */
    void batchChangeServiceTime(Set<String> ids, String serviceTimeId);

    /**
     * 批量解绑设备（小程序）
     *
     * @param ids
     * @return
     */
    UnBindResultVO batchUnbindDeviceForDevOps(Set<String> ids);

    /**
     * 添加设备
     *
     * @param deviceAddForChargeVO
     */
    BaseResult addDeviceForDevOps(DeviceAddForChargeVO deviceAddForChargeVO);

    /**
     * 判断设备是否已被绑定
     *
     * @param machineNo
     * @param imei
     * @return
     */
    Boolean judgeDevice(String machineNo, String imei);

    /**
     * 处理具体位置
     *
     * @param deviceEntity
     * @return
     */
    String parseConcretePosition(DeviceEntity deviceEntity);

    /**
     * 更新设备交互时间
     *
     * @param imei
     * @param timestamp
     */
    void updateInteractionTime(String imei, String timestamp);

    /**
     * 搜索产线测试设备
     *
     * @param imei
     * @param moduleStatus
     * @param qrCode
     * @param pageable
     * @return
     */
    PageResult<ProdLineTestDeviceListVO> searchLineTestDeviceList(String imei, DeviceModuleStatus moduleStatus, String qrCode, Pageable pageable);

    /**
     * 设备产线测试
     *
     * @param deviceId
     * @param code
     */
    BaseResult<?> lineTestDevice(String deviceId, String code);

    /**
     * 保存
     *
     * @param deviceEntity
     * @return
     */
    DeviceEntity save(DeviceEntity deviceEntity);

    /*
    根据Imei查找设备
     */
    DeviceEntity findByImei(String imei);

    /**
     * 同步上线状态
     *
     * @param deviceEntity
     */
    void syncOnlineStatus(DeviceEntity deviceEntity);

    /**
     * 导入出厂设备
     *
     * @param file
     * @return
     */
    BaseResult<?> deviceImportForFactory(MultipartFile file);

    /**
     * 洗衣机解除关联的加液器
     * @param wahsId
     * @param pumpId
     * @return
     */
    BaseResult unRelete(String wahsId, String pumpId);

    /**
     * 洗衣机关联加液器
     * @param releteVo
     * @return
     */
    BaseResult relete(ReleteVO releteVo);

    void updateDeviceStatus(String status,String imei);
}
